#ifndef RUTINAS_H
#define RUTINAS_H

#include "BufferCache.h"
#include "Semaforo.h"

#include <unistd.h>
#include <errno.h>
#include <signal.h>
//#include <ucontext.h>
//#include <sys/types.h>
//#include <sys/wait.h>
#include <math.h>

//senales:

//funcion de interceptacion de la senal SIGUSR1: 
//para despertar a los procesos dormidos (esperando que se desbloquee un buffer o esperando que se libere cualquier buffer)
void my_sigusr1(int n, siginfo_t *info, void *p);


//funcion de interceptacion de la senal SIGUSR2:
//para la implementacion de escritura retardada 
void my_sigusr2(int n, siginfo_t *info, void *p);

void captura_usr1_usr2(); //intercepta las senales USR1 y USR2

void sleepUntilFree();
//void sleepUntilDW();

//***********************************************
//Rutinas para la BufferCache:

/* Nota: se usara int nbuf para representar un buffer,
para llegar a struct Buffer: cache->bufs[nbuf]
para llegar a char * : cache->bufs[nbuf].datos */

/*Atencion: solo se puede hacer un semWait() seguido. 
por tanto, antes de cada funcion que haga semWait() no debe haber antes otro semWait(), si acaso un semSignal(). */

//dos rutinas de mas bajo nivel
int getblk(int fs, int inodo, int bloque); //Asignacion de buffer. devuelve nBuffer.
void brelse(int nbuf); //liberacion del buffer


//rutinas de mas alto nivel
int bread(int fd, int fs, int inodo, int bloque); //Lectura de buffer de disco. devuelve buffer bloqueado. amañada: uso de fd para llamar read
//Buffer breada(int fs, int bloque); //Lectura anticipada de buffer de disco. devuelve buffer bloqueado
void bwrite(int nbuf); //simplemente pone DW a

#endif

